package cn.iocoder.yudao.module.hs.service.entryorder;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.hs.controller.admin.bigscreen.vo.WarehouseMaterialCount;
import cn.iocoder.yudao.module.hs.controller.admin.entryorder.vo.*;
import cn.iocoder.yudao.module.hs.controller.admin.trayscanrecord.vo.TrayScanRecordRespVO;
import cn.iocoder.yudao.module.hs.dal.dataobject.entryorder.EntryOrderDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 入库单 Service 接口
 *
 * @author 航盛
 */
public interface EntryOrderService {

    /**
     * 创建入库单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createEntryOrder(@Valid EntryOrderSaveReqVO createReqVO);

    /**
     * 创建三方入库单
     *
     * @param createReqVO 创建信息
     */
    void createTripartiteEntryOrder(@Valid TripartiteEntryOrderSaveReqVO createReqVO);

    /**
     * 创建快速入库单
     *
     * @param createReqVO 创建信息
     */
    void createQuickEntryOrder(@Valid QuickEntryOrderSaveReqVO createReqVO);

    /**
     * 更新入库单
     *
     * @param updateReqVO 更新信息
     */
    void updateEntryOrder(@Valid EntryOrderSaveReqVO updateReqVO);

    /**
     * 删除入库单
     *
     * @param id 编号
     */
    void deleteEntryOrder(Long id);

    /**
     * 获得入库单
     *
     * @param id 编号
     * @return 入库单
     */
    EntryOrderDO getEntryOrder(Long id);

    /**
     * 获得入库单分页
     *
     * @param pageReqVO 分页查询
     * @return 入库单分页
     */
    PageResult<EntryOrderRespVO> getEntryOrderPage(EntryOrderPageReqVO pageReqVO);

    /**
     * 根据托盘码获取入库单
     *
     * @param trayCode 托盘码
     * @return 入库单
     */
    EntryOrderDO getEntryOrderByTrayCode(Long warehouseId, String trayCode);

    /**
     * 查询当日所有入库单入库的物料数量
     * @return
     */
    List<WarehouseMaterialCount> getWarehouseMaterialCountList();

    /**
     *
     * @return
     */
    Integer getProductWarehouseHistoryCount(boolean isToday);

    /**
     * 获得入库单中托盘列表
     * @param shipOrderId
     * @param warehouseId
     * @return
     */
    List<EntryOrderTrayRespVO> getTrayList(Long shipOrderId, Long warehouseId);
}